上週六補班,只有一天假日真是難熬
不過接下來有三天假
今天來看Monkey C的繼承
在Monkey C也有繼承,跟java一樣,使用關鍵字extend
子類繼承了母類之後,
就算子類沒有實作母類的function,
在新建的子類物件也可以直接使用母類的function(不可使用母類的成員變數)
不過不是所有function都會被繼承,
在java,繼承母類的子類不會實作母類的建構子
而在Monkey C ,子類一樣不會實作母類的initialize()
因此,子類如果要使用母類的initialize()則需要先定義一個自己的initialize()
再從自己的initialize()裡面呼叫母類的initialize()來實作,
如下方範例中,calss Sphere的initialize()裡面,又再呼叫了母類Circle.initialize()
此外,由於Monkey C沒有super
的用法,
所以沒辦法像java一樣直接用super的寫法去呼叫母類的function,
不過可以透過母類名.function名去呼叫,
如下方範例,
子類Sphere裡面的describe()方法是以Circle.describe()的寫法去呼叫母類Circle的describe()
就程式碼的易讀性而言我會更喜歡Monkey C的做法
using Toybox.Math as Math;
using Toybox.System as System;
class Circle {
var mRadius;
function initialize(aRadius) {
mRadius = aRadius;
}
function getCircumference() {
return 2 * Math.PI * Math.pow(self.mRadius, 2); // 2*PI*r
}
function getArea() {
return Math.PI * Math.pow(self.mRadius, 2); // PI*r^2
}
function describe() {
System.println("Circle!");
}
}
class Sphere extends Circle {
function initialize(aRadius) {
Circle.initialize(aRadius);
}
function getArea() {
return 4 * Math.PI * Math.pow(self.mRadius, 2); // 4*PI*r^2
}
function describe() {
System.print("I'm a Sphere! My parent is a ");
Circle.describe();
}
}